﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using SistemaDeBastanteodePoderes.Persistencia;
using SistemaDeBastanteodePoderes.Dominio;

namespace SistemaDeBastanteodePoderes.Pruebas.DAO
{
        [TestFixture]
    public class Test_H7_1_RolesDAO
    {
       // IrolesDAO rolesDAO = null; // Utilizamos una referencia a la interfaz
        IRolesDAO rolesDAO = null;
       // Roles rolcreado = null;
        Roles rolcreado = null;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            rolesDAO = new Persistencia.NH.RolesDAO(); // Elegimos la implementación DAO a probar (ADO ó NHibernate)
            foreach (Roles tipo in rolesDAO.ListarTodos())
                rolesDAO.Eliminar(tipo);
        }

        [Test]
        public void Test1_Crear()
        {
            Roles rolACrear = new Roles();
            // 1. Validar que ocurra un error si no se ingresa la Descripcion del Rol
            rolACrear.Descripcion = null;
           Assert.Catch<Exception>(delegate
            {
                rolcreado = rolesDAO.Crear(rolACrear);
            });

            // 2. Validar que se crea correctamente (sin error) el Rol
             rolACrear.Descripcion = "ABOGADO";
            Assert.DoesNotThrow(delegate
            {
                rolcreado = rolesDAO.Crear(rolACrear);
            });

            // 3. Validar que se crea correctamente (sin error) un segundo Rol
              rolACrear.Descripcion = "CAJERO";
            Assert.DoesNotThrow(delegate
            {
                rolcreado = rolesDAO.Crear(rolACrear);
            });

            // 4. Validar que el tipo creado no sea nulo, que tenga un código mayor que 0 y que la descripcion sea la ingresada
            Assert.IsNotNull(rolcreado);
            Assert.Greater(rolcreado.Codigo, 0);
            Assert.AreEqual(rolcreado.Descripcion, rolACrear.Descripcion);
        }
        [Test]
        public void Test2_Obtener()
        {
            Roles obtenido = null;
            // 1. Validar que si se intenta obtener un Rol inexistente se retorne null
            Assert.DoesNotThrow(delegate
            {
                obtenido = rolesDAO.Obtener(1000);
            });
            Assert.IsNull(obtenido);
            // 2. Validar que se obtenga un Rol correctamente (sin error)
            Assert.DoesNotThrow(delegate
            {
                obtenido = rolesDAO.Obtener(rolcreado.Codigo);
            });
            Assert.IsNotNull(obtenido);
        }
        [Test]
        public void Test3_Modificar()
        {
            Roles rolAModificar = rolesDAO.Obtener(rolcreado.Codigo);
            Roles rolModificado = null;
            // 1. Validar que ocurre un error si Descripcion ingresada es nula
            rolAModificar.Descripcion = null;
            Assert.Catch<Exception>(delegate
            {
                rolModificado = rolesDAO.Modificar(rolAModificar);
            });
            // 2. Validar que se modifica correctamente (sin error) el rol
            rolAModificar.Descripcion = "ABOGADO";
            Assert.DoesNotThrow(delegate
            {
                rolModificado = rolesDAO.Modificar(rolAModificar);
            });
            // 3. Validar que el rol modificado no sea nulo y la descripcion sea la ingresada
            Assert.IsNotNull(rolModificado);
            Assert.AreEqual(rolAModificar.Descripcion, rolModificado.Descripcion);
        }
        [Test]
        public void Test4_Eliminar()
        {
            Roles rolAEliminar = rolesDAO.Obtener(rolcreado.Codigo);
            // 1. Validar que ocurra un error si se intenta eliminar un rol inexistente
            Assert.Catch<Exception>(delegate
            {
                rolesDAO.Eliminar(null);
            });
            // 2. Validar que se elimine un rol correctamente
            Assert.DoesNotThrow(delegate
            {
                rolesDAO.Eliminar(rolAEliminar);
            });
            // 3. Validar que el rol eliminado ya no exista
            Roles rolEliminado = rolesDAO.Obtener(rolcreado.Codigo);
            Assert.IsNull(rolEliminado);
        }
        [Test]
        public void Test5_Listar()
        {
            rolesDAO.Crear(new Roles() {Descripcion = "ABOGADO" });
            rolesDAO.Crear(new Roles() {Descripcion = "CAJERO" });
            // 1. Validar que se listen sin errores los tipos de empresa creados
            ICollection<Roles> rolesExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                rolesExistentes = rolesDAO.ListarTodos();
            });
            // 2. Validar que retorne los 2 tipos de empresa creados
            Assert.GreaterOrEqual(rolesExistentes.Count, 2);
            // 3. Validar que la Abreviacion de cada tipo de empresa no sea nula
            foreach (Roles rol in rolesExistentes)
                Assert.IsNotNull(rol.Descripcion);
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            foreach (Roles tipo in rolesDAO.ListarTodos())
                rolesDAO.Eliminar(tipo);
            Persistencia.NH.NHibernateHelper.CerrarFabrica();
        }
    }
}